Внедряем в апплет компоненты

Загрузить проект

Первым делом исправим допущенную неточность. В конце предыдущего шага когда зашла речь о том, что понадобится веб-сервер я сказал что лучше если это будет Apache. Оказалось что это только для меня лучше (ибо об установке и настройке рассказывать не надо), а на самом деле это не совсем так. Слово эксперту:

"Apache не создан под Java. Могу предложить бесплатно распространяемый, самый быстрый (!!!), несложный (а в прошлом самый простой), дешевый при коммерческом использовании (всего $500) Web-сервер Resin... Apache хороший сервер, но не для нас, джавистов. Мир Java многогранен, сложен, гармоничен. Открою секрет: основное преимущество Java не в апплетах, не в графических приложениях. Платформа Java - королева Internet. В Java-платформе есть спецификация специальной технологии для Web-сервисов: JSP и Servlet. Это простая по сути, но очень мощная, гибкая, чрезвычайно удобная архитектура. Так вот, коль есть спецификация, значит есть и серверы, ей удовлетворяющие. А раз есть серверы, значит и надо их использовать. Resin - тот сервер (он далеко не единственный). Apache, каким бы хорошим он ни был, - не тот сервер."

Danis Tazeyev

Ну что ж, если кто уже (по моей вине) установил Apache то прошу меня простить, хотя думаю, что знания полученные при его настройке никому не помешают. Как завести Resin и чем его кормить мы рассмотрим как только нам понадобится веб-сервер. Теперь вернемся к теме шага.

Немного теории

Java полностью объектно ориентированный язык, в нем не может существовать глобальных функций. Поэтому разберемся для начала как создавать объекты. Обычно это происходит в два этапа: объявление и создание экземпляра класса. Пример:
AnyObject Ob;
Ob=new AnyObject();
В первой строке происходит простое объявление типа. Во второй за дело берется оператор new, он выделает нашим данным память и вызывает конструктор объекта для проведения начальной инициализации. Это можно сделать и одной строкой:
AnyObject Ob=new AnyObject();
в принципе от этого ничего не изменится. Кроме того, новый объект можно не создавать присвоив новой переменной значение существующего объекта:
AnyObject Ob1=new AnyObject();
AnyObject Ob2=Ob1;
Кем в этом случае есть Ob2 для Ob1? Нет не копией, как можно было подумать, - собственно им он и есть со всеми вытекающими, то есть изменив поведение(свойство) Ob2, вы измените Ob1 и наоборот. Эквивалентный код на C++:
AnyObject& Ob2=Ob1;
Теперь рассмотрим AWT-компоненты и их назначение:

Создаем код

import java.awt.*;
import java.applet.*;

public class Applet1 extends Applet
{
 //Действие 1
 Button But1, But2;
 Checkbox Ch1, Ch2, Ch3;
 CheckboxGroup ChGroup;
 Choice Cho;
 List Li;
 Label Lab;
 TextField TeF;
 TextArea TeAr;
 
 public void init()
 {
  //Действие 2
  But1=new Button("Press me");
  //Действие 3
  Ch1=new Checkbox("Undependent");
  
  ChGroup=new CheckboxGroup();
  
  Ch2=new Checkbox("Dependent1", ChGroup, false);
  Ch3=new Checkbox("Dependent2", ChGroup, true);
  
  //Действие 4
  Cho=new Choice();
  Cho.addItem("Item 1");
  Cho.addItem("Item 2");
  Cho.addItem("Item 3");
  
  //Действие 5
  Li=new List ();
  Li.addItem("1 Item");
  Li.addItem("2 Item");
  
  //Действие 6
  Lab=new Label();
  Lab.setText("I am label");
  
  //Действие 7
  TeF=new TextField("Editable Text");
  
  //Действие 8
  TeAr=new TextArea(10, 15);
  TeAr.setText("Multiline and\r\neditable area");
  
  //Действие 9
  But2=But1;
  
  //Действие 10
  add(But1);
  add(But2);
  add(Ch1);
  add(Ch2);
  add(Ch3);
  add(Cho);
  add(Li);
  add(Lab);
  add(TeF);
  add(TeAr);
 }
}

Разбираем код

В первой строке с помощью "*" подключаем всю библиотеку AWT в которая и содержит компоненты. В действии первом объявляем всех кто нам понадобится. Во втором - создаем кнопку с надписью на ней. Надпись потом можно и поменять с помощью метода setLabel(). Далее (д.3) создаем простой переключатель ch1, он у нас будет независимым. Теперь создадим зависимые переключатели ch2 и ch3. Делают это с помощью вспомогательного класса CheckboxGroup, вот мы и создаем его и передаем как параметр в конструкторы нашим переключателям с зависимой фиксацией. Кроме того в этих конструкторах задаем начальное состояние переключателей(в состоянии "включен" из группы может быть только один, я выбрал второй). В действиях 4 и 5 создаем списки выпадающий и раскрытый соответственно, кроме этого, с помощью метода addItem() добавим в них насколько пунктов. Далее (д.6) создаем метку и устанавливаем текст который она будет отображать (текст можно было указать и прямо в конструкторе). В действии 7 создадим однострочное текстовое поле указав в конструкторе начальный текст (сделать это также можно было методом setText() как в случае с меткой). И, наконец, создадим многострочное текстовое поле (д.8) из 10-ти рядков и 15-ти столбцов, после чего установим в нем начальный текст. Осталось нам создать только кнопку But2. Давайте пожадничаем памятью и присвоим ей значение But1 чтоб посмотреть что из этого выйдет.(д.9)

А теперь самое интересное - "добавляем" с помощью метода add() все наши компоненты в апплет. Вот и вся суть этого шага. Апплет, как мы уже говорили, является потомком класса Container а значит и умещать в себе компоненты умеет, этим мы и воспользовались.

Смотрим на апплет

Итак компилируем и запускаем. Кто решил сделать это как в прошлый раз скажите браузеру пусть места побольше для апплета выделит чтоб все уместилось (например width=350 height=300). Если все нормально вы сейчас можете полюбоваться на наши компоненты, покликать, исправить текст в редактируемых полях и пожалуй все, больше они пока делать ничего не умеют. А как они размещены вам нравиться? Мне не очень. Методами размещения компонент мы займемся в следующем шаге.

Кстати а где вторая кнопка? Мы ведь две размещали! Вы уже, конечно обо всем догадались. Объект-то на обе переменные (But1 и But2) единственный, а на одну панель (Panel - предок Applet) нельзя дважды один и тот же компонент ставить.

Вместо послесловия

Вот мы и разместили старые добрые (так и напрашивается и никому уже ненужные) AWT - компоненты. В дальнейшем мы будем работать с Swing - компонентами. Для чего же мы этими занимались? Ну во-первых знать нужно все, а во-вторых сходство между ними большое. Переделываем на скорую руку код под Swing:
import javax.swing.*;
import java.awt.*;

public class Swing1 extends JApplet
{
 //Опять же все объявляем
 JButton But1;
 JCheckBox Ch1;
 JRadioButton Ch2, Ch3;
 ButtonGroup BGroup;
 JComboBox Cho;
 JList Li;
 JLabel Lab;
 JTextField TeF;
 JTextArea TeAr;
 
 public void init()
 {
  /* Тут как и раньше, только название компонент 
     немного другое конечно */
  But1=new JButton("Press me");
  
  Ch1=new JCheckBox("Undependent");
  
  /* Для зависимых переключателей в Swing спец. класс
     имеется, хотя здесь можно и JCheckBox использовать
     с тем же успехом, но тогда квадратики вместо кружков
     будут - неприлично это для радиокнопок */ 	  
  Ch2=new JRadioButton("Dependent1");
  Ch3=new JRadioButton("Dependent2", true);
  
  /* Класс для групировки здесь немного по-другому
     устроен и работать он с разными кнопками может */	
  BGroup=new ButtonGroup();
  BGroup.add(Ch2);
  BGroup.add(Ch3);

  /* Это аналог класса Choise, заполняется он немного
     иначе */ 
  String[] ItemStrings = { "Item 1", "Item 2", "Item 3"};
  JComboBox Cho = new JComboBox(ItemStrings);  
  
  // Раскрытый список
  String[] ItemStrings2 = { "1 Item", "2 Item"};
  Li=new JList (ItemStrings2);
  
  /* Строки ниже аналогично как и раньше
     лишь компоненты новые */
  Lab=new JLabel();
  Lab.setText("I am label");
  
  TeF=new JTextField("Editable Text");
  
  TeAr=new JTextArea(10, 15);
  TeAr.setText("Multiline and\r\neditable area");
    
  //Об этой строке в следующем шаге
  getContentPane().setLayout(new FlowLayout()); 
  
  //Здесь помещаем компоненты в апплет
  getContentPane().add(But1);
  getContentPane().add(Ch1);
  getContentPane().add(Ch2);
  getContentPane().add(Ch3);
  getContentPane().add(Cho);
  getContentPane().add(Li);
  getContentPane().add(Lab);
  getContentPane().add(TeF);
  getContentPane().add(TeAr);
 }
}
Кратко проанализируем: Первым делом мы подключили соответствующую библиотеку import javax.swing.*;. Класс нашего апплета наследуется теперь от JApplet. Это потомок класса Applet который может работать с Swing-компонентами. Название большинства компонент практически то же самое только с буквы "J". Я немного прокомментировал в коде их создание но работа с ними требует отдельного разговора. А вот помещаем мы компоненты в апплет немного иначе. В отличие от класса Applet который для размещения компонент использует возможности родительских классов, класс JApplet содержит в себе (как свое поле) класс JRootPane и пользуется им для размещения компонент. Принципиально JRootPane является панелью, среди его ближайших предков классы Container(AWT) и JComponent(Swing). Вот этот объект мы и получаем методом getContentPane(), а дальше вызываем у него знакомый нам метод add(). Компилируем (убедившись в поддержке компилятором Java 2), запускаем. Компоненты конечно покрасивей, а как увидим дальше, и пофункциональней.

Далее

Разбираемся с Layout Manager
Автор: Vitaly.
Hosted by uCoz